package uiMain.menuconsola;

import gestorHotel.Hotel;
import gestorHotel.habitacion.*;
import gestorHotel.reserva.LineaReserva;
import gestorHotel.reserva.Reserva;
import gestorHotel.reserva.TipoEstadoReserva;
import gestorHotel.usuarios.Usuario;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class OpcionDeMenuCrearReserva extends OpcionDeMenu {

	public void ejecutar() {
		Scanner in = new Scanner(System.in);
		String h = seleccionarHotel();
		
		Hotel hotel = Main.hoteles.get(h);
		
		boolean disponible = false;
		for (Habitacion hab : hotel.getHabitaciones().values()) {
			disponible |= hab.getEstado() == TipoEstadoHabitacion.LIBRE;
		}
		
		if (!disponible) {
			System.out.println("No hay habitaciones disponibles!");
			return;
		} else {
			System.out.print("Ingrese la fecha de entrada: ");
			String fechaEntrada = in.nextLine();
			System.out.print("Ingrese la fecha de reserva: ");
			String fechaReserva = in.nextLine();
			System.out.print("Ingrese el número de noches: ");
			int numNoches = Integer.parseInt(in.nextLine());
			System.out.print("Ingrese el número de personas: ");
			int numPersonas = Integer.parseInt(in.nextLine());
			
			TipoEstadoReserva estado = TipoEstadoReserva.PENDIENTE;
			
			String usuario = Main.usuario.getUsuario();
			
			int codReserva = 0;
			for (Reserva r : hotel.getReservas().values())
				codReserva = Math.max(codReserva, r.getCodReserva());
			
			++codReserva;

			double precioEstimado = 0.0;
			ArrayList<LineaReserva> lineas = new ArrayList<LineaReserva>();
			HashSet<Integer> habReservadas = new HashSet<Integer>();
			while (true) {
				System.out.print("Desea agregar una habitación a la reserva? (Y/N): ");
				String yn = in.nextLine();
				
				if (yn.toLowerCase().startsWith("n")) break;
				
				System.out.print("Ingrese la cantidad de personas: ");
				int cantidad = Integer.parseInt(in.nextLine());
				
				System.out.print("Desea cama supletoria? (Y/N): ");
				boolean sup = in.nextLine().toLowerCase().startsWith("y") ? true : false;
				
				System.out.println("Seleccione la habitación:");
				int k = 0;
				ArrayList<Integer> opciones = new ArrayList<Integer>();
				for (Habitacion hab : hotel.getHabitaciones().values()) {
					if (hab.getEstado() == TipoEstadoHabitacion.LIBRE) {
						System.out.println((k + 1) + ". " + hab.getNumero());
						opciones.add(hab.getNumero());
						++k;
					}
				}
				
				System.out.print("Seleccione una opción: ");
				int oph = Integer.parseInt(in.nextLine());
				
				int hab = opciones.get(oph - 1);
				habReservadas.add(hab);
				
				Habitacion habitacion = hotel.getHabitaciones().get(hab);
				Tipo tipo = hotel.getTipos().get(habitacion.getTipo());
				Categoria categoria = hotel.getCategorias().get(habitacion.getCategoria());
				
				double precio = numNoches * tipo.getPrecio() * categoria.getSuplemento();
				
				LineaReserva linea = new LineaReserva(cantidad, sup, hab);
				lineas.add(linea);
				
				precioEstimado += precio;
			}
			
			Reserva reserva = new Reserva(fechaEntrada, fechaReserva, numNoches, 
					estado, numPersonas, lineas, usuario, codReserva);
			
			System.out.println("El precio estimado para la reserva es: " + precioEstimado);
			
			if (confirmarAccion()) {
				for (int hab : habReservadas)
					Main.hoteles.get(h).getHabitaciones().get(hab).setEstado(TipoEstadoHabitacion.RESERVADA);
				
				reserva.crear(h);
				
				System.out.println("El código de reserva es: " + reserva.getCodReserva());
			}
		}
	}

	public String getDescripcion() {
		return "Reserva de habitación disponible.";
	}

}
